import Taro from '@tarojs/taro'
import { API_BASE_URL } from '../../../config/env'

const baseURL = API_BASE_URL

// 创建请求函数，使用Taro的网络请求API
const createRequest = (method: 'GET' | 'POST' | 'PUT' | 'DELETE') => {
  return async (url: string, data?: any, config?: any) => {
    const fullUrl = `${baseURL}${url}`
    console.log(`[${method}] 请求地址:`, fullUrl)
    
    try {
      // 获取token
      let token = ''
      try {
        token = Taro.getStorageSync('token')
      } catch (error) {
        console.warn('获取token失败:', error)
      }

      // 构建请求头
      const headers = {
        'Content-Type': 'application/json',
        ...(token && { Authorization: `Bearer ${token}` }),
        ...(config?.headers || {})
      }

      console.log('请求头:', headers)
      console.log('请求数据:', data)

      // 发起请求
      const response = await Taro.request({
        url: fullUrl,
        method,
        data: method === 'GET' ? undefined : data,
        header: headers,
        timeout: 30000, // 增加超时时间到30秒
        ...(method === 'GET' && data && { data })
      })

      console.log('响应状态码:', response.statusCode)
      console.log('响应数据:', response.data)

      // 检查响应状态
      if (response.statusCode >= 200 && response.statusCode < 300) {
        return response.data
      } else {
        throw new Error(`请求失败: ${response.statusCode}`)
      }
    } catch (error) {
      console.error('网络请求错误:', error)
      console.error('请求URL:', fullUrl)
      console.error('错误详情:', JSON.stringify(error, null, 2))
      
      // 检查是否是网络连接错误
      if (error.errMsg && error.errMsg.includes('timeout')) {
        throw new Error('网络请求超时，请检查网络连接')
      } else if (error.errMsg && error.errMsg.includes('fail')) {
        throw new Error('网络连接失败，请检查服务器地址和网络设置')
      }
      
      throw error
    }
  }
}

// 封装请求方法
const request = {
  get: createRequest('GET'),
  post: createRequest('POST'),
  put: createRequest('PUT'),
  delete: createRequest('DELETE'),
}

// 文件上传函数
export const uploadFile = async (filePath: string, name?: string) => {
  const uploadUrl = `${baseURL}/aiimg/upload`
  console.log('上传文件到:', uploadUrl)
  console.log('文件路径:', filePath)
  
  try {
    const response = await Taro.uploadFile({
      url: uploadUrl,
      filePath: filePath,
      name: 'photo',
      formData: {
        name: name || '魔镜测脸'
      },
      timeout: 60000, // 增加上传超时时间到60秒
      header: {
        'Content-Type': 'multipart/form-data'
      }
    })

    console.log('上传响应状态码:', response.statusCode)
    console.log('上传响应数据:', response.data)

    // 解析响应数据
    const data = JSON.parse(response.data)
    
    if (response.statusCode === 200 && data.code === 200) {
      return data
    } else {
      throw new Error(data.message || '上传失败')
    }
  } catch (error) {
    console.error('文件上传失败:', error)
    console.error('上传URL:', uploadUrl)
    console.error('文件路径:', filePath)
    console.error('错误详情:', JSON.stringify(error, null, 2))
    
    if (error.errMsg && error.errMsg.includes('timeout')) {
      throw new Error('文件上传超时，请检查网络连接')
    } else if (error.errMsg && error.errMsg.includes('fail')) {
      throw new Error('文件上传失败，请检查服务器地址和网络设置')
    }
    
    throw error
  }
}

// 导出实例和请求方法
export default request

// 导出常用的请求方法
export const { get, post, put, delete: del } = request
